package com.disruptor.demo.event;

import lombok.Data;

/**
 * 秒杀订单事件类
 * 作用：作为Disruptor框架中事件流转的核心数据载体，串联「库存校验→订单处理→结果通知」全链路
 * 设计逻辑：通过字段记录订单关键信息与处理状态，各处理器通过修改字段值传递处理结果，无需额外数据传输介质
 */
@Data
public class SeckillOrderEvent {
    /**
     * 订单全局唯一标识
     * 生成方式：UUID（去除"-"符号），确保分布式环境下无ID冲突
     * 用途：追踪订单全生命周期（库存扣减、订单处理、通知推送），作为日志与排查的核心标识
     */
    private String orderId;

    /**
     * 下单用户ID
     * 用途：关联下单用户，用于后续结果通知（如推送短信/APP消息）、用户订单查询
     * 示例：USER_123（测试场景）、真实场景可关联用户系统的唯一ID（如手机号/用户编号）
     */
    private String userId;

    /**
     * 秒杀商品ID
     * 用途：关联待抢购的商品，与Redis/数据库中的商品库存关联，实现库存精准扣减
     * 配置来源：从application.yml的seckill.goods-id读取，确保多实例使用统一商品ID
     */
    private String goodsId;

    /**
     * 商品购买数量
     * 约束：秒杀场景通常限制为1件（防止恶意囤货），可通过业务逻辑动态调整
     * 作用：作为库存扣减的计算依据（如剩余库存 >= buyCount 才允许扣减）
     */
    private int buyCount;

    /**
     * 事件处理状态（状态机设计）
     * 流转顺序：INIT → STOCK_CHECK → ORDER_PROCESS → NOTIFY
     * 各状态含义：
     * - INIT：事件初始状态（刚由生产者发布，未进入任何处理器）
     * - STOCK_CHECK：库存校验阶段（由StockCheckHandler处理）
     * - ORDER_PROCESS：订单处理阶段（由OrderProcessHandler处理，依赖库存校验通过）
     * - NOTIFY：结果通知阶段（由ResultNotifyHandler处理，依赖订单处理完成）
     */
    private String processStatus;

    /**
     * 处理失败信息
     * 填充时机：任意处理器处理失败时（如库存不足、订单处理异常）
     * 用途：1. 下游处理器根据该字段跳过失败订单；2. 结果通知时告知用户失败原因
     * 示例："库存不足了"、"订单处理失败：数据库连接超时"
     */
    private String errorMsg;

    /**
     * 失败重试次数
     * 初始值：0（事件创建时默认赋值）
     * 作用：控制失败订单的重试次数（如超过seckill.max-retry则进入死信处理）
     * 修改逻辑：由SeckillOrderExceptionHandler在捕获异常时递增
     */
    private int retryCount;
}
